﻿/**
 * @file guild_service_basic_context.h
 * @date 2021/05/08 10:05
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief 公会基础服务上下文
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/05/08 10:05         <td>1.0.0       <td>harrybao <td>创建初始版本
 * <tr><td>2021/06/02 20:24         <td>1.0.1       <td>harrybao <td>添加同意加入公会功能
 * <tr><td>2021/07/21 16:17         <td>1.0.2       <td>harrybao <td>添加rpc_call
 * </table>
 */

#pragma once

#include <memory>
#include "rpc_root.h"

struct CreateGuildArg;
struct CreateGuildRes;
struct ApplyJoinGuildArg;
struct ApplyJoinGuildRes;
struct KickOutGuildMemberArg;
struct KickOutGuildMemberRes;
struct QuitGuildArg;
struct QuitGuildRes;
struct SetAutoApprovalArg;
struct SetAutoApprovalRes;
struct ChangeGuildIconIdArg;
struct ChangeGuildIconIdRes;
struct ChangeGuildNameArg;
struct ChangeGuildNameRes;
struct ChangeGuildDeclarationArg;
struct ChangeGuildDeclarationRes;
struct ChangeGuildAnnounceArg;
struct ChangeGuildAnnounceRes;
struct ApproveJoinGuildArg;
struct ApproveJoinGuildRes;
struct SetGuildMemberDutyArg;
struct SetGuildMemberDutyRes;
struct LoginArg;
struct LoginRes;
struct LogoutNtfData;
struct GiveGuildItemArg;
struct GiveGuildItemRes;

namespace kratos {
namespace service {
class ServiceContext;
}
}  // namespace kratos

namespace guild_service {

/**
 * @brief 公会基础服务上下文类
 *
 */
class GuildServiceBasicContext {
  GuildServiceBasicContext() = delete;
  GuildServiceBasicContext(const GuildServiceBasicContext &) = delete;
  GuildServiceBasicContext(GuildServiceBasicContext &&) = delete;
  const GuildServiceBasicContext &operator=(const GuildServiceBasicContext &) =
      delete;
  const GuildServiceBasicContext &operator=(GuildServiceBasicContext &&) =
      delete;

 public:
  /**
   * @brief 启动
   *
   * @param context 服务上下文
   * @return true 启动成功
   * @return false 启动失败
   */
  static bool Start(kratos::service::ServiceContext *context);

  /**
   * @brief 关闭
   *
   * @return true 关闭成功
   * @return false 关闭失败
   */
  static bool Stop();

  /**
   * @brief 初始化
   * @param context
   * @return 执行结果
   */
  static bool Init(kratos::service::ServiceContext *context);

  /**
   * @brief 未初始化
   * @return 执行结果
   */
  static bool Uninit();

  /**
   * @brief 更新
   *
   * @param ms 间隔（单位 毫秒 ）
   */
  static void Tick(time_t ms);

  /**
   * @brief 创建公会
   *
   * @param arg 创建公会参数
   * @param res 创建公会返回
   */
  static void CreateGuild(rpc::StubCallPtr call, const CreateGuildArg &arg,
                          std::shared_ptr<CreateGuildRes> &res);

  /**
   * @brief 申请加入公会
   *
   * @param arg 申请加入公会参数
   * @param res 申请加入公会返回
   */
  static void ApplyJoinGuild(rpc::StubCallPtr call, const ApplyJoinGuildArg &arg,
                             std::shared_ptr<ApplyJoinGuildRes> &res);

  /**
   * @brief 踢出公会成员
   *
   * @param arg 踢出公会成员参数
   * @param res 踢出公会成员返回
   */
  static void KickOutGuildMember(rpc::StubCallPtr call, const KickOutGuildMemberArg &arg,
                                 std::shared_ptr<KickOutGuildMemberRes> &res);

  /**
   * @brief 设置自动同意入会
   *
   * @param arg 设置自动同意入会参数
   * @param res 设置自动同意入会返回
   */
  static void SetAutoApproval(rpc::StubCallPtr call, const SetAutoApprovalArg &arg,
                              std::shared_ptr<SetAutoApprovalRes> &res);

  /**
   * @brief 退出公会
   *
   * @param arg 退出公会参数
   * @param res 退出公会返回
   */
  static void QuitGuild(rpc::StubCallPtr call, const QuitGuildArg &arg,
                        std::shared_ptr<QuitGuildRes> &res);

  /**
   * @brief 修改公会图标
   *
   * @param arg 修改公会图标参数
   * @param res 修改公会图标返回
   */
  static void ChangeGuildIconId(rpc::StubCallPtr call, const ChangeGuildIconIdArg &arg,
                                std::shared_ptr<ChangeGuildIconIdRes> &res);

  /**
   * @brief 修改公会名字
   *
   * @param arg 修改公会名字参数
   * @param res 修改公会名字返回
   */
  static void ChangeGuildName(rpc::StubCallPtr call, const ChangeGuildNameArg &arg,
                              std::shared_ptr<ChangeGuildNameRes> &res);

  /**
   * @brief 修改公会宣言
   *
   * @param arg 修改公会宣言参数
   * @param res 修改公会宣言返回
   */
  static void ChangeGuildDeclaration(rpc::StubCallPtr call, 
      const ChangeGuildDeclarationArg &arg,
      std::shared_ptr<ChangeGuildDeclarationRes> &res);

  /**
   * @brief 修改公会通知
   *
   * @param arg 修改公会通知参数
   * @param res 修改公会通知返回
   */
  static void ChangeGuildAnnounce(rpc::StubCallPtr call, const ChangeGuildAnnounceArg &arg,
                                  std::shared_ptr<ChangeGuildAnnounceRes> &res);

  /**
   * @brief 同意加入公会
   * @param arg 同意加入公会参数
   * @param res 同意加入公会返回
   */
  static void ApproveJoinGuild(rpc::StubCallPtr call, const ApproveJoinGuildArg &arg,
                               std::shared_ptr<ApproveJoinGuildRes> &res);
  /**
   * @brief 设置公会成员职位
   * @param arg 设置公会成员职位参数
   * @param res 设置公会成员职位返回
   */
  static void SetGuildMemberDuty(rpc::StubCallPtr call, const SetGuildMemberDutyArg &arg,
                                 std::shared_ptr<SetGuildMemberDutyRes> &res);

  /**
   * @brief 登录
   *
   * @param call rpc请求
   * @param arg 注册参数
   * @param res 注册返回
   */
  static void Login(rpc::StubCallPtr call, const LoginArg &arg,
                       const std::shared_ptr<LoginRes> &res);

  /**
   * @brief 登出
   * 
   * @param data 登出参数
   */
  static void Logout(rpc::StubCallPtr call, const LogoutNtfData &data);
  
  /**
   * @brief 上交公会道具
   * 
   * @param arg 上交公会道具参数
   * @param res 上交公会道具返回
   */
  static void GiveGuildItem(rpc::StubCallPtr call, const GiveGuildItemArg &arg,
                            std::shared_ptr<GiveGuildItemRes> &res);
};

}  // namespace guild_service
